/**
 * 
 */
package com.pxingg.log;

import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.log4j.Appender;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;

/**
 * 对整个系统的Log4j日志进行相应的配置,初始的日志级别的DEBUG
 * 
 * @author pxingg
 * 
 */
public class LogConfig
{
    /**
     * The log of this class
     */
    static Log log = LogFactory.getLog(LogConfig.class);

    /**
     * 标记整个系统的日志对象是不是已经被初始化<br>
     * 设定这个对象时为了避免日志对象被重复初始化操作
     */
    static boolean isInit = false;

    /**
     * 在启用info级别的日志时，保留debug log的appender
     */
    static Appender debugLogAppender = null;

    /**
     * 初始化这个系统的Log4j的日志配置<br>
     * 初始的日志级别的DEBUG
     */
    static public void init()
    {
        if (LogConfig.isInit)
        {
            // 已经完成初始化工作，不需要再重复初始化
            return;
        }

        try
        {
            final Properties props = new Properties();
            final InputStream istream = LogConfig.class.getResourceAsStream("/com/pxingg/log/log4j.properties");
            props.load(istream);
            istream.close();
            // 装入log4j配置信息
            PropertyConfigurator.configure(props);
            // 初始的日志级别的DEBUG
            LogConfig.setLevelDEBUG();
        }
        catch (final IOException e)
        {
            e.printStackTrace();
            return;
        }
        // 标记已经完成初始化工作，避免再重复初始化
        LogConfig.isInit = true;
    }

    /**
     * 设置日志级别为调试日志<br>
     * 调试日志记录程序运行的关键路径，方法的返回，关键的码流等信息<br>
     * 日志级别：INFO > DEBUG > TRACE
     */
    static public void setLevelDEBUG()
    {
        Logger.getLogger("com.pxingg").setLevel(Level.DEBUG);
        if (LogConfig.debugLogAppender != null)
        {
            Logger.getLogger("com.pxingg").addAppender(LogConfig.debugLogAppender);
        }

    }

    /**
     * 设置日志级别为运行日志<br>
     * 运行日志记录程序运行的关键路径<br>
     * 日志级别：INFO > DEBUG > TRACE
     */
    static public void setLevelINFO()
    {
        Logger.getLogger("com.pxingg").setLevel(Level.INFO);
        // 删除掉debug日志的appender，info信息不再写到debug中去
        LogConfig.debugLogAppender = Logger.getLogger("com.pxingg").getAppender("SHP_DEBUG");
        Logger.getLogger("com.pxingg").removeAppender(LogConfig.debugLogAppender);
    }

    /**
     * 设置日志级别为跟踪日志<br>
     * 调试日志记录程序运行的所有路径，方法的返回，所有的码流等信息<br>
     * 日志级别：INFO > DEBUG > TRACE
     */
    static public void setLevelTRACE()
    {
        Logger.getLogger("com.pxingg").setLevel(Level.TRACE);
        if (LogConfig.debugLogAppender != null)
        {
            Logger.getLogger("com.pxingg").addAppender(LogConfig.debugLogAppender);
        }
    }
}
